/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EItempedido;
import AccesoDatos.Persistencia.Entidad.EPedido;
import LogicaNegocio.Biblioteca.ItemPedido;
import LogicaNegocio.Biblioteca.Pedido;
import MainBiblioSoft.BiblioSoft;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.RollbackException;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Multa en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerPedido.java
 * @version 1.0
 * Fecha: mar may  4 14:53:27 COT 2010
 */


public class ManagerPedido {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Pedido
     * 
     */
    public ManagerPedido() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Metodo encargado de la persistencia en la entidad Pedido
     * de un objeto Pedido
     * 
     * @param pedido
     */
    public void crearPedido(Pedido pedido) throws EntityExistsException, RollbackException {
        entityManager.clear();
        EPedido entidadPedido = new EPedido();
        entidadPedido.setNumeropedido(pedido.getNumeroPedido());
        entidadPedido.setCedulaempleado(pedido.getCedulaBibliotecario());
        entidadPedido.setFecharealizacion(pedido.getFechaRealizacion());
        entidadPedido.setComprado(pedido.getComprado());
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entityManager.persist(entidadPedido);
        transaccion.commit();
        entityManager.clear();
    }

    /**
     * Cambia el estado a comprado cuando el pedido es comprado.
     *
     * @param numeroPedido
     */
    public void comprarPedido(int numeroPedido) {
        entityManager.clear();
        EPedido entidadPedido;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadPedido = entityManager.find(EPedido.class, numeroPedido);
        transaccion.commit();
        if(entidadPedido != null){
            entidadPedido.setComprado(true);
            transaccion.begin();
            entityManager.merge(entidadPedido);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Metodo que actualiza un pedido de la base de datos.
     * 
     * @param numeroPedido
     * @param pedido
     */
    public void actualizarPedido(int numeroPedido, Pedido pedido) {
        entityManager.clear();
        EPedido entidadPedido;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadPedido = entityManager.find(EPedido.class, numeroPedido);
        transaccion.commit();
        if(entidadPedido != null){
            entidadPedido.setNumeropedido(pedido.getNumeroPedido());
            entidadPedido.setCedulaempleado(pedido.getCedulaBibliotecario());
            entidadPedido.setFecharealizacion(pedido.getFechaRealizacion());
            entidadPedido.setComprado(pedido.getComprado());
            transaccion.begin();
            entityManager.merge(entidadPedido);
            transaccion.commit();
            Query consulta = entityManager.createQuery("UPDATE EItempedido e SET e.numeropedido = :numeropedidonuevo  WHERE e.numeropedido = :numeropedidoanterior");
            consulta.setParameter("numeropedidonuevo", pedido.getNumeroPedido());
            consulta.setParameter("numeropedidoanterior", numeroPedido);
            transaccion.begin();
            consulta.executeUpdate();
            transaccion.commit();
        }
        entityManager.clear();
    }

    public Pedido obtenerPedido(int numeroPedido) {
        entityManager.clear();
        EPedido entidadPedido;
        Pedido pedido = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadPedido = entityManager.find(EPedido.class, numeroPedido);
        transaccion.commit();
        if(entidadPedido != null){
            pedido = new Pedido();
            pedido.setNumeroPedido(entidadPedido.getNumeropedido());
            pedido.setCedulaBibliotecario(entidadPedido.getCedulaempleado());
            pedido.setFechaRealizacion(entidadPedido.getFecharealizacion());
            pedido.setComprado(entidadPedido.getComprado());
            pedido.setListaItemsPedidos(obtenerItemsPedido(numeroPedido));
        }
        entityManager.clear();
        return pedido;
    }

    private List<ItemPedido> obtenerItemsPedido(int numeroPedido) {
        entityManager.clear();
        List<ItemPedido> listaItems = new ArrayList<ItemPedido>();
        ItemPedido itemPedido;
        EItempedido entidadItemPedido;
        //SELECT * FROM ITEMPEDIDO WHERE NUMEROPEDIDO = 1001;
        Query consulta = entityManager.createNamedQuery("EItempedido.findByNumeropedido");
        consulta.setParameter("numeropedido", numeroPedido);
        Iterator iterador = consulta.getResultList().iterator();
        while(iterador.hasNext()){
            entidadItemPedido = (EItempedido)iterador.next();
            itemPedido = new ItemPedido();
            itemPedido.setCantidad(entidadItemPedido.getCantidaditem());
            itemPedido.setIdItem(entidadItemPedido.getIditem());
            itemPedido.setIsbnPedido(entidadItemPedido.getIsbnpedido());
            itemPedido.setNumeroPedido(entidadItemPedido.getNumeropedido());
            listaItems.add(itemPedido);
        }
        entityManager.clear();
        return listaItems;
    }
}
